{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3decfaff",
   "metadata": {},
   "source": [
    "# pandas dataframe 测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1d95016d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     0    1    2\n",
      "0  2.0  1.0  3.0\n",
      "1  3.0  NaN  2.0\n",
      "2  1.0  0.0  NaN\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "table = [[2.0, 1.0, 3.0],\n",
    "             [3.0, np.nan, 2.0],\n",
    "             [1.0, 0.0, np.nan]]\n",
    "\n",
    "df = pd.DataFrame(table)\n",
    "print(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "46c66f4f",
   "metadata": {},
   "source": [
    "copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "1bd3e96c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0    1    2\n",
       "0  2.0  1.0  3.0\n",
       "1  3.0  NaN  2.0\n",
       "2  1.0  0.0  NaN"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2 = df.copy()\n",
    "df2 = df.copy()\n",
    "df2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9627621f",
   "metadata": {},
   "source": [
    "cumsum()  累加函数\n",
    "参数\t介绍\t默认值\n",
    "axis\t对每行的值累加（1或columns）或者对每列的值累加（0或index）\t可选值{0 or ‘index’, 1 or ‘columns’}, 默认值0\n",
    "skipna\t是否排除空值（NaN）\t默认值True\n",
    "返回值\t为Series 或 DataFrame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a732ee70",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     0    1    2\n",
      "0  2.0  1.0  3.0\n",
      "1  5.0  NaN  5.0\n",
      "2  6.0  1.0  NaN\n",
      "     0    1    2\n",
      "0  2.0  3.0  6.0\n",
      "1  3.0  NaN  5.0\n",
      "2  1.0  1.0  NaN\n"
     ]
    }
   ],
   "source": [
    "print(df.cumsum())#或axis=‘index’\n",
    "print(df.cumsum(axis=1))#或axis=‘columns’"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1363e656",
   "metadata": {},
   "source": [
    "df.idxmax() 返回在请求轴上第一次出现最大值的索引。不包括NA/null"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a43cf408",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>66</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>6</td>\n",
       "      <td>8</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   A   B   C\n",
       "0  4  11   1\n",
       "1  4   2   8\n",
       "2  2   5  66\n",
       "3  6   8   4"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({\"A\":[4, 4, 2, 6],  \n",
    "                   \"B\":[11, 2, 5, 8], \n",
    "                   \"C\":[1, 8, 66, 4]}) \n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "566bb90d",
   "metadata": {},
   "source": [
    "行过滤一"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3ee4e3e6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.query('A==2')['A'].squeeze()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3accba81",
   "metadata": {},
   "source": [
    "行过滤二"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2d694508",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   A   B  C\n",
       "0  4  11  1\n",
       "1  4   2  8"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[df['A']==4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "50c350fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 索引倒序\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "337bb7b2",
   "metadata": {},
   "source": [
    "去重"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "002416b7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[4, 2, 6]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.A.unique().tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c79ff517",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    3\n",
       "B    0\n",
       "C    2\n",
       "dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.idxmax(axis = 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d491a27",
   "metadata": {},
   "source": [
    "df.plot() 画图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "17d6e708",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.660163</td>\n",
       "      <td>0.299971</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.681077</td>\n",
       "      <td>0.171860</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.131906</td>\n",
       "      <td>0.685135</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.520038</td>\n",
       "      <td>0.397198</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.198999</td>\n",
       "      <td>0.441974</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.690909</td>\n",
       "      <td>0.507007</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.090892</td>\n",
       "      <td>0.423395</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.035853</td>\n",
       "      <td>0.838195</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.251291</td>\n",
       "      <td>0.040673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.470927</td>\n",
       "      <td>0.919724</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1\n",
       "0  0.660163  0.299971\n",
       "1  0.681077  0.171860\n",
       "2  0.131906  0.685135\n",
       "3  0.520038  0.397198\n",
       "4  0.198999  0.441974\n",
       "5  0.690909  0.507007\n",
       "6  0.090892  0.423395\n",
       "7  0.035853  0.838195\n",
       "8  0.251291  0.040673\n",
       "9  0.470927  0.919724"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(np.random.rand(10,2))\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "9309fb1f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 指定column = 1的列的轴为右轴的y轴\n",
    "df.plot(secondary_y=[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "005e847b",
   "metadata": {},
   "source": [
    "df.dropna()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "86772ee8",
   "metadata": {},
   "source": [
    "df.dropna(subset=['a']) 保留a字段，并删除其nan的行"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30c71b60",
   "metadata": {},
   "source": [
    "df.rank() 计算沿轴的数值数据等级（1到n）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "646972e5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B    C\n",
       "0  2.0  4.0  1.0\n",
       "1  3.0  1.0  3.0\n",
       "2  1.0  2.0  4.0\n",
       "3  4.0  3.0  2.0"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.rank()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78b6ee0e",
   "metadata": {},
   "source": [
    ".sum(axis=1)，计算每行的算数和"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a1d0f85b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    7.0\n",
       "1    7.0\n",
       "2    7.0\n",
       "3    9.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.rank().sum(axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9abc620",
   "metadata": {},
   "source": [
    "df.pct_change()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "1b20644f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    4\n",
      "1    5\n",
      "2    2\n",
      "3    6\n",
      "Name: A, dtype: int64\n",
      "0     NaN\n",
      "1    0.25\n",
      "2   -0.60\n",
      "3    2.00\n",
      "Name: A, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "print(df['A'])\n",
    "print(df['A'].pct_change())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aba40752",
   "metadata": {},
   "source": [
    "# groupby, apply, lambda 函数的使用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "2162fc99",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>course</th>\n",
       "      <th>grade</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jack</td>\n",
       "      <td>Chinese</td>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Alex</td>\n",
       "      <td>Math</td>\n",
       "      <td>1</td>\n",
       "      <td>95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Bob</td>\n",
       "      <td>Math</td>\n",
       "      <td>2</td>\n",
       "      <td>91</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Nancy</td>\n",
       "      <td>Chinese</td>\n",
       "      <td>2</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Mary</td>\n",
       "      <td>Math</td>\n",
       "      <td>2</td>\n",
       "      <td>89</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Alice</td>\n",
       "      <td>English</td>\n",
       "      <td>2</td>\n",
       "      <td>60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Jerry</td>\n",
       "      <td>Chinese</td>\n",
       "      <td>3</td>\n",
       "      <td>87</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Wolf</td>\n",
       "      <td>English</td>\n",
       "      <td>3</td>\n",
       "      <td>79</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    name   course  grade  score\n",
       "0   Jack  Chinese      1     85\n",
       "1   Alex     Math      1     95\n",
       "2    Bob     Math      2     91\n",
       "3  Nancy  Chinese      2     78\n",
       "4   Mary     Math      2     89\n",
       "5  Alice  English      2     60\n",
       "6  Jerry  Chinese      3     87\n",
       "7   Wolf  English      3     79"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({'name':['Jack','Alex','Bob','Nancy','Mary','Alice','Jerry','Wolf'],\n",
    "              'course':['Chinese','Math','Math','Chinese','Math','English','Chinese','English'],\n",
    "              'grade':[1,1,2,2,2,2,3,3],\n",
    "              'score':[85,95,91,78,89,60,87,79]})\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4ece69a",
   "metadata": {},
   "source": [
    "2 分组聚合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "29c58aee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001C6F49CA5F8>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_group = df.groupby('course')\n",
    "df_group"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "d4247d28",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Chinese\n",
      "    name   course  grade  score\n",
      "0   Jack  Chinese      1     85\n",
      "3  Nancy  Chinese      2     78\n",
      "6  Jerry  Chinese      3     87\n",
      "English\n",
      "    name   course  grade  score\n",
      "5  Alice  English      2     60\n",
      "7   Wolf  English      3     79\n",
      "Math\n",
      "   name course  grade  score\n",
      "1  Alex   Math      1     95\n",
      "2   Bob   Math      2     91\n",
      "4  Mary   Math      2     89\n"
     ]
    }
   ],
   "source": [
    "for course, group in df_group:\n",
    "    print(course)\n",
    "    print(group)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "952c33be",
   "metadata": {},
   "source": [
    "3 结合 apply, lambda函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "4e66cf14",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>grade</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>course</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"8\" valign=\"top\">Chinese</th>\n",
       "      <th>count</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>83.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>4.725816</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>78.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.500000</td>\n",
       "      <td>81.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>85.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>2.500000</td>\n",
       "      <td>86.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>87.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"8\" valign=\"top\">English</th>\n",
       "      <th>count</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.500000</td>\n",
       "      <td>69.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.707107</td>\n",
       "      <td>13.435029</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>60.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>2.250000</td>\n",
       "      <td>64.750000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2.500000</td>\n",
       "      <td>69.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>2.750000</td>\n",
       "      <td>74.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>79.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"8\" valign=\"top\">Math</th>\n",
       "      <th>count</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>1.666667</td>\n",
       "      <td>91.666667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.577350</td>\n",
       "      <td>3.055050</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>89.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.500000</td>\n",
       "      <td>90.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>91.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>93.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>95.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  grade      score\n",
       "course                            \n",
       "Chinese count  3.000000   3.000000\n",
       "        mean   2.000000  83.333333\n",
       "        std    1.000000   4.725816\n",
       "        min    1.000000  78.000000\n",
       "        25%    1.500000  81.500000\n",
       "        50%    2.000000  85.000000\n",
       "        75%    2.500000  86.000000\n",
       "        max    3.000000  87.000000\n",
       "English count  2.000000   2.000000\n",
       "        mean   2.500000  69.500000\n",
       "        std    0.707107  13.435029\n",
       "        min    2.000000  60.000000\n",
       "        25%    2.250000  64.750000\n",
       "        50%    2.500000  69.500000\n",
       "        75%    2.750000  74.250000\n",
       "        max    3.000000  79.000000\n",
       "Math    count  3.000000   3.000000\n",
       "        mean   1.666667  91.666667\n",
       "        std    0.577350   3.055050\n",
       "        min    1.000000  89.000000\n",
       "        25%    1.500000  90.000000\n",
       "        50%    2.000000  91.000000\n",
       "        75%    2.000000  93.000000\n",
       "        max    2.000000  95.000000"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ss = df_group.apply(lambda x: x.describe())\n",
    "ss"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0aa7b529",
   "metadata": {},
   "source": [
    "4 对结果块进行操作运算：lambda"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f76c0dd5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "course\n",
       "Chinese    83.333333\n",
       "English    69.500000\n",
       "Math       91.666667\n",
       "dtype: float64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_group.apply(lambda y: np. mean(y['score']))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "229b6786",
   "metadata": {},
   "source": [
    "5 使用自定义函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "c2abfc9f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "course    \n",
       "Chinese  0    85\n",
       "         3    78\n",
       "         6    87\n",
       "English  5    60\n",
       "         7    79\n",
       "Math     1    95\n",
       "         2    91\n",
       "         4    89\n",
       "Name: score, dtype: int64"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def test_apply(x, column='score'):\n",
    "    return x[column]\n",
    "\n",
    "df_group.apply(test_apply)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbd9a28a",
   "metadata": {},
   "source": [
    "pipe() 专门用于对Series和DataFrame操作进行流水线（pipeline）改造的API，其作用是将嵌套的函数调用过程改造为链式过程，其第一个参数func传入作用于对应Series或DataFrame的函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "520f90bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Sally</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Mary</td>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>John</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    name  age\n",
       "0  Sally   50\n",
       "1   Mary   40\n",
       "2   John   30"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def change_age(x):\n",
    "    x[\"age\"]=[10, 20, 30]\n",
    "    return x\n",
    "\n",
    "data = {\n",
    "\"name\": [\"Sally\", \"Mary\", \"John\"],\n",
    "\"age\": [50, 40, 30]\n",
    "}\n",
    "\n",
    "df = pd.DataFrame(data)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "81073a83",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    name  age\n",
      "0  Sally   10\n",
      "1   Mary   20\n",
      "2   John   30\n"
     ]
    }
   ],
   "source": [
    "df.pipe(change_age)\n",
    "print(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "49377098",
   "metadata": {},
   "source": [
    "rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)\n",
    "\n",
    "window：表示时间窗的大小，注意有两种形式(int or offset)。如果使用int，则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型，表示时间窗的大小。pandas offset相关可以参考这里。\n",
    "\n",
    "后面需要再接一个统计函数，e.g. sum(), agg()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "722cd966",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     B\n",
       "0  0.0\n",
       "1  1.0\n",
       "2  2.0\n",
       "3  NaN\n",
       "4  4.0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c9da9c63",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     B\n",
       "0  NaN\n",
       "1  1.0\n",
       "2  3.0\n",
       "3  NaN\n",
       "4  NaN"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.rolling(2).sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4988fad",
   "metadata": {},
   "source": [
    "agg(func, axis=0, *args, **kwargs)\n",
    "\n",
    "使用指定axis上的一个或多个操作Aggregate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "d7a1e12d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B    C\n",
       "0  1.0  2.0  3.0\n",
       "1  4.0  5.0  6.0\n",
       "2  7.0  8.0  9.0\n",
       "3  NaN  NaN  NaN"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame([[1, 2, 3],\n",
    "                   [4, 5, 6],\n",
    "                   [7, 8, 9],\n",
    "                   [np.nan, np.nan, np.nan]],\n",
    "                  columns=['A', 'B', 'C'])\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "99ca66bc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>sum</th>\n",
       "      <td>12.0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        A     B     C\n",
       "sum  12.0  15.0  18.0\n",
       "min   1.0   2.0   3.0"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.agg(['sum', 'min'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "c5afa04e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>NaN</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sum</th>\n",
       "      <td>12.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        A    B\n",
       "max   NaN  8.0\n",
       "min   1.0  2.0\n",
       "sum  12.0  NaN"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.agg({'A' : ['sum', 'min'], 'B' : ['min', 'max']})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "338d6add",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['A', 'B', 'C']"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[\"_\".join(col) for col in df.columns]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f3bed5c6",
   "metadata": {},
   "source": [
    "选择包含特定列值的pandas行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c2f070b3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       Date  Sales  Price\n",
      "1  April-11    300      1\n",
      "4  April-14    300      3\n",
      "5  April-16    300      2\n"
     ]
    }
   ],
   "source": [
    "dates=['April-10', 'April-11', 'April-12', 'April-13','April-14','April-16']\n",
    "sales=[200,300,400,200,300,300]\n",
    "prices=[3, 1, 2, 4,3,2]\n",
    "\n",
    "df = pd.DataFrame({'Date':dates ,\n",
    "                   'Sales':sales ,\n",
    "                   'Price': prices})\n",
    "\n",
    "df_mask=df['Sales']==300\n",
    "filtered_df = df[df_mask]\n",
    "print(filtered_df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2cd1741f",
   "metadata": {},
   "source": [
    "找到指定数值所在行索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5a13db1f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "index = df[df['Price']==1].index\n",
    "index.tolist()[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "1eccd5d8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 2, 4, 3]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[1:5]['Price'].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "dd793284",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 索引倒序 无法切片\n",
    "df.iloc[5:1]['Price'].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "64b2da5b",
   "metadata": {},
   "outputs": [],
   "source": [
    "df.loc[:,'new_c1'] = value\n",
    "df_c = df.copy()\n",
    "df_c.loc[:,'new_c'] = df['new_c1']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0d55e83c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
